const fs = require('fs')
const path = require('path')

/**
 * 1、确定路径
 * 2、判断路径是目录还是文件
 * 3、如果是目录，则需要遍历目录中的所有子项，删选出目录和文件
 * 4、如果是文件，则计算文件大小
 * 5、定义一个全局变量，存放 size
 * 6、遍历结束返回 size
 */

let totalSize = 0

function sizeCalc(url, cb, isLast) {
  const pathUrl = path.join(__dirname, url)

  // 文件状态
  fs.stat(pathUrl, (err, statObj) => {
    if(err) return cb(err)

    // 判断
    if (statObj.isFile()) { // 文件
      totalSize += statObj.size
      // 最后一个
      if(isLast === undefined || isLast) {
        cb(null, totalSize)
      }
    } else if (statObj.isDirectory()) { // 目录
      let isLast = false

      fs.readdir(pathUrl, (err, files) => {
        // 文件状态
        const filesTypeList = files.map(r => {
          const subUrl = path.join(pathUrl, r)
          return fs.statSync(subUrl).isDirectory()
        })

        // 查找最后的文件夹或文件
        let index = files.length - 1
        filesTypeList.forEach((item, i) => {
          if(item) index = i
        })

        // 遍历
        for (let i = 0; i < files.length; i++) {
          if(i === index) {
            isLast = true
          } else {
            isLast = false
          }
          const subUrl = path.join(url, files[i])
          sizeCalc(subUrl, cb, isLast)
        }
      })
    } else {
      cb({ msg: '请传输正确的路径', code: '404' })
    }
  })
}

sizeCalc('../01', (err, totalSize) => {
  if(err) return console.log('发生错误');
  console.log(totalSize)
})

